home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 2005 October / DPPCPRO1005.ISO / Download / Web Developer / webdeveloper.xpi / chrome / webdeveloper.jar / content / webdeveloper / webdeveloper.js < prev   
Encoding:
Text File  |  2005-03-21  |  97.3 KB  |  2,269 lines

  1. var webdeveloper_appliedStyles               = new Array();
  2. var webdeveloper_debug                       = false;
  3. var webdeveloper_javaScriptConsoleListener   = false;
  4. var webdeveloper_javaScriptCurrentTime       = null;
  5. var webdeveloper_javaScriptPreviousTime      = null;
  6. var webdeveloper_keyboardShortcutsConfigured = false;
  7. var webdeveloper_localizedOptionsSetup       = false;
  8. var webdeveloper_outlinedElements            = new Array();
  9. var webdeveloper_selectedTab                 = -1;
  10. var webdeveloper_userStyleSheet              = null;
  11.  
  12. webdeveloper_initialize();
  13.  
  14. // Displays the about dialog
  15. function webdeveloper_about()
  16. {
  17.     window.openDialog("chrome://webdeveloper/content/about/about.xul", "webdeveloper-about-dialog", "centerscreen,chrome,modal");
  18. }
  19.  
  20. // Add applied style
  21. function webdeveloper_addAppliedStyle(id)
  22. {
  23.     webdeveloper_appliedStyles.push(id);
  24. }
  25.  
  26. // Adds the style sheet at the given location with the given id
  27. function webdeveloper_addStyleSheet(location, id, applyStyle)
  28. {
  29.     const mainTabBox   = getBrowser().mTabBox;
  30.     const documentList = webdeveloper_getDocuments(getBrowser().browsers[mainTabBox.selectedIndex].contentWindow, new Array());
  31.  
  32.     var headElementList = null;
  33.     var linkElement     = null;
  34.     var pageDocument    = null;
  35.  
  36.     // Loop through the documents
  37.     for(var i = 0; i < documentList.length; i++)
  38.     {
  39.         pageDocument    = documentList[i];
  40.         headElementList = pageDocument.getElementsByTagName("head");
  41.         linkElement     = pageDocument.createElement("link");
  42.  
  43.         linkElement.setAttribute("href", location);
  44.         linkElement.setAttribute("id", id);
  45.         linkElement.setAttribute("media", "all");
  46.         linkElement.setAttribute("rel", "stylesheet");
  47.         linkElement.setAttribute("type", "text/css");
  48.  
  49.         // If there is a head element
  50.         if(headElementList.length > 0)
  51.         {
  52.             headElementList[0].appendChild(linkElement);
  53.         }
  54.         else
  55.         {
  56.             pageDocument.documentElement.appendChild(linkElement);
  57.         }
  58.     }
  59.  
  60.     // If applying style
  61.     if(applyStyle)
  62.     {
  63.         webdeveloper_addAppliedStyle(id);
  64.     }
  65. }
  66.  
  67. // Applies all selected style sheets
  68. function webdeveloper_applyStyleSheets(reload)
  69. {
  70.     var appliedStyle = null;
  71.  
  72.     // Loop through the applied styles
  73.     for(var i = 0; i < webdeveloper_appliedStyles.length; i++)
  74.     {
  75.         appliedStyle = webdeveloper_appliedStyles[i];
  76.  
  77.         // Switch on the style
  78.         switch(appliedStyle)
  79.         {
  80.             case "webdeveloper-add-user-style-sheet":
  81.                 webdeveloper_addUserStyleSheet(document.getElementById("webdeveloper-add-user-style-sheet-menu"), false);
  82.                 break;
  83.             case "webdeveloper-disable-all-styles":
  84.                 webdeveloper_toggleStyles(document.getElementById("webdeveloper-disable-all-styles-menu"), false);
  85.                 break;
  86.             case "webdeveloper-disable-default-styles":
  87.                 webdeveloper_toggleStyles(document.getElementById("webdeveloper-disable-default-styles-menu"), false);
  88.                 break;
  89.             case "webdeveloper-disable-embedded-styles":
  90.                 webdeveloper_toggleEmbeddedStyles(document.getElementById("webdeveloper-disable-embedded-styles-menu"), false);
  91.                 break;
  92.             case "webdeveloper-disable-inline-styles":
  93.                 webdeveloper_toggleInlineStyles(document.getElementById("webdeveloper-disable-inline-styles-menu"), false);
  94.                 break;
  95.             case "webdeveloper-disable-linked-styles":
  96.                 webdeveloper_toggleLinkedStyles(document.getElementById("webdeveloper-disable-linked-styles-menu"), false);
  97.                 break;
  98.             case "webdeveloper-display-access-keys":
  99.                 webdeveloper_displayAccessKeys(document.getElementById("webdeveloper-display-access-keys-menu"), false);
  100.                 break;
  101.             case "webdeveloper-display-anchors":
  102.                 webdeveloper_displayAnchors(document.getElementById("webdeveloper-display-anchors-menu"), false);
  103.                 break;
  104.             case "webdeveloper-display-block-size":
  105.                 webdeveloper_displayBlockSize(document.getElementById("webdeveloper-display-block-size-menu"), false);
  106.                 break;
  107.             case "webdeveloper-display-current-size-title":
  108.                 // If the page has been reloaded
  109.                 if(reload)
  110.                 {
  111.                     webdeveloper_displayWindowSizeInTitle(document.getElementById("webdeveloper-display-current-size-title-menu"), false);
  112.                 }
  113.                 break;
  114.             case "webdeveloper-display-form-details":
  115.                 webdeveloper_displayFormDetails(document.getElementById("webdeveloper-display-form-details-menu"), false);
  116.                 break;
  117.             case "webdeveloper-display-id-class-details":
  118.                 webdeveloper_displayIDClassDetails(document.getElementById("webdeveloper-display-id-class-details-menu"), false);
  119.                 break;
  120.             case "webdeveloper-display-image-dimensions":
  121.                 webdeveloper_displayImageDimensions(document.getElementById("webdeveloper-display-image-dimensions-menu"), false);
  122.                 break;
  123.             case "webdeveloper-display-image-file-sizes":
  124.                 webdeveloper_displayImageFileSizes(document.getElementById("webdeveloper-display-image-file-sizes-menu"), false);
  125.                 break;
  126.             case "webdeveloper-display-image-paths":
  127.                 webdeveloper_displayImagePaths(document.getElementById("webdeveloper-display-image-paths-menu"), false);
  128.                 break;
  129.             case "webdeveloper-display-link-paths":
  130.                 webdeveloper_displayLinkPaths(document.getElementById("webdeveloper-display-link-paths-menu"), false);
  131.                 break;
  132.             case "webdeveloper-display-tab-index":
  133.                 webdeveloper_displayTabIndex(document.getElementById("webdeveloper-display-tab-index-menu"), false);
  134.                 break;
  135.             case "webdeveloper-display-topographic-information":
  136.                 webdeveloper_displayTopographicInformation(document.getElementById("webdeveloper-display-topographic-information-menu"), false);
  137.                 break;
  138.             case "webdeveloper-hide-background-images":
  139.                 webdeveloper_hideBackgroundImages(document.getElementById("webdeveloper-hide-background-images-menu"), false);
  140.                 break;
  141.             case "webdeveloper-hide-images":
  142.                 webdeveloper_hideImages(document.getElementById("webdeveloper-hide-images-menu"), "webdeveloper-hide-images", false);
  143.                 break;
  144.             case "webdeveloper-linearize-page":
  145.                 webdeveloper_linearizePage(document.getElementById("webdeveloper-linearize-page-menu"), false);
  146.                 break;
  147.             case "webdeveloper-make-images-invisible":
  148.                 webdeveloper_makeImagesInvisible(document.getElementById("webdeveloper-make-images-invisible-menu"), "webdeveloper-make-images-invisible", false);
  149.                 break;
  150.             case "webdeveloper-outline-block-level-elements":
  151.                 webdeveloper_outlineBlockLevelElements(document.getElementById("webdeveloper-outline-block-level-elements-menu"), false);
  152.                 break;
  153.             case "webdeveloper-outline-custom-elements":
  154.                 webdeveloper_outlineElements(document.getElementById("webdeveloper-outline-custom-elements-menu"), false);
  155.                 break;
  156.             case "webdeveloper-outline-deprecated-elements":
  157.                 webdeveloper_outlineDeprecatedElements(document.getElementById("webdeveloper-outline-deprecated-elements-menu"), false);
  158.                 break;
  159.             case "webdeveloper-outline-frames":
  160.                 webdeveloper_outlineFrames(document.getElementById("webdeveloper-outline-frames-menu"), false);
  161.                 break;
  162.             case "webdeveloper-outline-images-with-adjusted-dimensions":
  163.                 webdeveloper_outlineImagesWithAdjustedDimensions(document.getElementById("webdeveloper-outline-images-with-adjusted-dimensions-menu"), false);
  164.                 break;
  165.             case "webdeveloper-outline-images-with-empty-alt-attributes":
  166.                 webdeveloper_outlineImagesWithEmptyAltAttributes(document.getElementById("webdeveloper-outline-images-with-empty-alt-attributes-menu"), false);
  167.                 break;
  168.             case "webdeveloper-outline-images-without-alt-attributes":
  169.                 webdeveloper_outlineImagesWithoutAltAttributes(document.getElementById("webdeveloper-outline-images-without-alt-attributes-menu"), false);
  170.                 break;
  171.             case "webdeveloper-outline-images-without-dimensions":
  172.                 webdeveloper_outlineImagesWithoutDimensions(document.getElementById("webdeveloper-outline-images-without-dimensions-menu"), false);
  173.                 break;
  174.             case "webdeveloper-outline-images-without-title-attributes":
  175.                 webdeveloper_outlineImagesWithoutTitleAttributes(document.getElementById("webdeveloper-outline-images-without-title-attributes-menu"), false);
  176.                 break;
  177.             case "webdeveloper-outline-links-without-title-attributes":
  178.                 webdeveloper_outlineLinksWithoutTitleAttributes(document.getElementById("webdeveloper-outline-links-without-title-attributes-menu"), false);
  179.                 break;
  180.             case "webdeveloper-outline-selected-element":
  181.                 webdeveloper_outlineSelectedElement(document.getElementById("webdeveloper-outline-selected-element-menu"), false);
  182.                 break;
  183.             case "webdeveloper-outline-table-cells":
  184.                 webdeveloper_outlineTableCells(document.getElementById("webdeveloper-outline-table-cells-menu"), false);
  185.                 break;
  186.             case "webdeveloper-outline-tables":
  187.                 webdeveloper_outlineTables(document.getElementById("webdeveloper-outline-tables-menu"), false);
  188.                 break;
  189.             case "webdeveloper-replace-images-with-alt-attributes":
  190.                 webdeveloper_replaceImagesWithAltAttributes(document.getElementById("webdeveloper-replace-images-with-alt-attributes-menu"), false);
  191.                 break;
  192.             case "webdeveloper-show-comments":
  193.                 webdeveloper_toggleComments(document.getElementById("webdeveloper-show-comments-menu"), false);
  194.                 break;
  195.             case "webdeveloper-use-border-box-model":
  196.                 webdeveloper_useBorderBoxModel(document.getElementById("webdeveloper-use-border-box-model-menu"), false);
  197.                 break;
  198.             case "webdeveloper-view-style-information":
  199.                 webdeveloper_viewStyleInformation(document.getElementById("webdeveloper-view-style-information-menu"), false);
  200.                 break;
  201.         }
  202.     }
  203. }
  204.  
  205. // Changes the options
  206. function webdeveloper_changeOptions(currentDocument)
  207. {
  208.     const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  209.     const toolbar            = document.getElementById("webdeveloper-toolbar");
  210.  
  211.     var element                   = null;
  212.     var hideMenuPreference        = false;
  213.     var hideContextMenuPreference = false;
  214.  
  215.     // If the hide menu preference is set
  216.     if(preferencesService.prefHasUserValue("webdeveloper.menu.hide"))
  217.     {
  218.         hideMenuPreference = preferencesService.getBoolPref("webdeveloper.menu.hide");
  219.     }
  220.  
  221.     // If the hide context menu preference is set
  222.     if(preferencesService.prefHasUserValue("webdeveloper.context.hide"))
  223.     {
  224.         hideContextMenuPreference = preferencesService.getBoolPref("webdeveloper.context.hide");
  225.     }
  226.  
  227.     // If the toolbar exists
  228.     if(toolbar)
  229.     {
  230.         const toolbarVisible = window.toolbar.visible;
  231.  
  232.         // If the toolbar is visible and the toolbar icons preference is set
  233.         if(toolbarVisible && preferencesService.prefHasUserValue("webdeveloper.toolbar.icons"))
  234.         {
  235.             const toolbarButtons = toolbar.getElementsByTagName("toolbarbutton");
  236.  
  237.             var toolbarPreference = preferencesService.getComplexValue("webdeveloper.toolbar.icons", Components.interfaces.nsISupportsString).data.trim();
  238.  
  239.             toolbar.setAttribute("mode", toolbarPreference);
  240.  
  241.             // If the toolbar preference is set to full
  242.             if(toolbarPreference == "full")
  243.             {
  244.                 toolbarPreference = null;
  245.             }
  246.             else if(toolbarPreference == "icons")
  247.             {
  248.                 toolbarPreference = "pictures";
  249.             }
  250.  
  251.             toolbar.setAttribute("buttonstyle", toolbarPreference);
  252.  
  253.             // Loop through the toolbar buttons
  254.             for(var i = 0; i < toolbarButtons.length; i++)
  255.             {
  256.                 toolbarButtons[i].setAttribute("buttonstyle", toolbarPreference);
  257.             }
  258.  
  259.             // If the toolbar preference is set to text
  260.             if(toolbarPreference == "text")
  261.             {
  262.                 element = document.getElementById("webdeveloper-toggle-statusbar");
  263.  
  264.                 // If the element exists
  265.                 if(element)
  266.                 {
  267.                     const stringBundle = document.getElementById("webdeveloper-string-bundle");
  268.  
  269.                     element.setAttribute("label", stringBundle.getString("webdeveloper_toggleLabel"));
  270.                 }
  271.             }
  272.             else
  273.             {
  274.                 element = document.getElementById("webdeveloper-javascript-statusbar");
  275.  
  276.                 // If the element exists
  277.                 if(element)
  278.                 {
  279.                     element.removeAttribute("label");
  280.                 }
  281.  
  282.                 element = document.getElementById("webdeveloper-render-mode-statusbar");
  283.  
  284.                 // If the element exists
  285.                 if(element)
  286.                 {
  287.                     element.removeAttribute("label");
  288.                 }
  289.  
  290.                 element = document.getElementById("webdeveloper-toggle-statusbar");
  291.  
  292.                 // If the element exists
  293.                 if(element)
  294.                 {
  295.                     element.removeAttribute("label");
  296.                 }
  297.             }
  298.         }
  299.     }
  300.  
  301.     element = document.getElementById("webdeveloper-menu");
  302.  
  303.     // If the element exists
  304.     if(element)
  305.     {
  306.         element.setAttribute("hidden", hideMenuPreference);
  307.     }
  308.  
  309.     element = document.getElementById("webdeveloper-context");
  310.  
  311.     // If the element exists
  312.     if(element)
  313.     {
  314.         element.setAttribute("hidden", hideContextMenuPreference);
  315.     }
  316.  
  317.     element = document.getElementById("webdeveloper-context-separator");
  318.  
  319.     // If the element exists
  320.     if(element)
  321.     {
  322.         element.setAttribute("hidden", hideContextMenuPreference);
  323.     }
  324.  
  325.     // If the keyboard shortcuts have not been configured
  326.     if(!webdeveloper_keyboardShortcutsConfigured)
  327.     {
  328.         webdeveloper_keyboardShortcutsConfigured = webdeveloper_configureKeyboardShortcuts(false);
  329.     }
  330. }
  331.  
  332. // Configures the equivalent element to whichever one is set
  333. function webdeveloper_configureEquivalentElements(element, attribute, value)
  334. {
  335.     const elementId = element.getAttribute("id");
  336.  
  337.     var equivalentElement   = null;
  338.     var equivalentElementId = null;
  339.  
  340.     // If the element exists
  341.     if(element)
  342.     {
  343.         // If the value is set
  344.         if(value)
  345.         {
  346.             element.setAttribute(attribute, value);
  347.         }
  348.         else
  349.         {
  350.             element.removeAttribute(attribute);
  351.         }
  352.     }
  353.  
  354.     // If the element is the context
  355.     if(elementId.indexOf("context") != -1)
  356.     {
  357.         equivalentElementId = elementId.split("context").join("menu");
  358.         equivalentElement   = document.getElementById(equivalentElementId);
  359.  
  360.         // If the equivalent element exists
  361.         if(equivalentElement)
  362.         {
  363.             // If the value is set
  364.             if(value)
  365.             {
  366.                 equivalentElement.setAttribute(attribute, value);
  367.             }
  368.             else
  369.             {
  370.                 equivalentElement.removeAttribute(attribute);
  371.             }
  372.         }
  373.  
  374.         equivalentElementId = elementId.split("context").join("toolbar");
  375.         equivalentElement   = document.getElementById(equivalentElementId);
  376.  
  377.         // If the equivalent element exists
  378.         if(equivalentElement)
  379.         {
  380.             // If the value is set
  381.             if(value)
  382.             {
  383.                 equivalentElement.setAttribute(attribute, value);
  384.             }
  385.             else
  386.             {
  387.                 equivalentElement.removeAttribute(attribute);
  388.             }
  389.         }
  390.     }
  391.     else if(elementId.indexOf("menu") != -1)
  392.     {
  393.         equivalentElementId = elementId.split("menu").join("context");
  394.         equivalentElement   = document.getElementById(equivalentElementId);
  395.  
  396.         // If the equivalent element exists
  397.         if(equivalentElement)
  398.         {
  399.             // If the value is set
  400.             if(value)
  401.             {
  402.                 equivalentElement.setAttribute(attribute, value);
  403.             }
  404.             else
  405.             {
  406.                 equivalentElement.removeAttribute(attribute);
  407.             }
  408.         }
  409.  
  410.         equivalentElementId = elementId.split("menu").join("toolbar");
  411.         equivalentElement   = document.getElementById(equivalentElementId);
  412.  
  413.         // If the equivalent element exists
  414.         if(equivalentElement)
  415.         {
  416.             // If the value is set
  417.             if(value)
  418.             {
  419.                 equivalentElement.setAttribute(attribute, value);
  420.             }
  421.             else
  422.             {
  423.                 equivalentElement.removeAttribute(attribute);
  424.             }
  425.         }
  426.     }
  427.     else if(elementId.indexOf("toolbar") != -1)
  428.     {
  429.         equivalentElementId = elementId.split("toolbar").join("context");
  430.         equivalentElement   = document.getElementById(equivalentElementId);
  431.  
  432.         // If the equivalent element exists
  433.         if(equivalentElement)
  434.         {
  435.             // If the value is set
  436.             if(value)
  437.             {
  438.                 equivalentElement.setAttribute(attribute, value);
  439.             }
  440.             else
  441.             {
  442.                 equivalentElement.removeAttribute(attribute);
  443.             }
  444.         }
  445.  
  446.         equivalentElementId = elementId.split("toolbar").join("menu");
  447.         equivalentElement   = document.getElementById(equivalentElementId);
  448.  
  449.         // If the equivalent element exists
  450.         if(equivalentElement)
  451.         {
  452.             // If the value is set
  453.             if(value)
  454.             {
  455.                 equivalentElement.setAttribute(attribute, value);
  456.             }
  457.             else
  458.             {
  459.                 equivalentElement.removeAttribute(attribute);
  460.             }
  461.         }
  462.     }
  463. }
  464.  
  465. // Configure the keyboard shortcuts
  466. function webdeveloper_configureKeyboardShortcuts(reset)
  467. {
  468.     const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  469.     const string             = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
  470.     const windowEnumeration  = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator).getEnumerator("navigator:browser");
  471.  
  472.     var mainDocument = null;
  473.     var success      = false;
  474.  
  475.     // Loop through the open windows
  476.     while(windowEnumeration.hasMoreElements())
  477.     {
  478.         mainDocument = windowEnumeration.getNext().document;
  479.  
  480.         // If a main document was found
  481.         if(mainDocument)
  482.         {
  483.             var id                 = null;
  484.             var key                = null;
  485.             var keyPreference      = null;
  486.             var keyPreferenceValue = null;
  487.             var keys               = null;
  488.             var keySet             = mainDocument.getElementById("mainKeyset");
  489.             var toolCount          = 0;
  490.             var url                = null;
  491.  
  492.             // If the key set was not found
  493.             if(!keySet)
  494.             {
  495.                 keySet = mainDocument.getElementById("navKeys");
  496.             }
  497.  
  498.             // If the key set was found
  499.             if(keySet)
  500.             {
  501.                 keys = keySet.childNodes;
  502.  
  503.                 // Loop through the keys
  504.                 for(var i = 0; i < keys.length; i++)
  505.                 {
  506.                     key = keys.item(i);
  507.  
  508.                     // If the key has an id starting with webdeveloper
  509.                     if(key.hasAttribute("id") && key.getAttribute("id").indexOf("webdeveloper") == 0)
  510.                     {
  511.                         id = key.getAttribute("id").split("-").join(".");
  512.  
  513.                         // If the key preference is set
  514.                         if(preferencesService.prefHasUserValue(id))
  515.                         {
  516.                             key.setAttribute("key", preferencesService.getComplexValue(id, Components.interfaces.nsISupportsString).data.trim());
  517.                         }
  518.                         else if(!reset)
  519.                         {
  520.                             string.data = key.getAttribute("key");
  521.  
  522.                             preferencesService.setComplexValue(id, Components.interfaces.nsISupportsString, string);
  523.                         }
  524.  
  525.                         success = true;
  526.                     }
  527.                 }
  528.  
  529.                 // If the tool count preference is set
  530.                 if(preferencesService.prefHasUserValue("webdeveloper.tool.count"))
  531.                 {
  532.                     toolCount = preferencesService.getIntPref("webdeveloper.tool.count");
  533.                 }
  534.  
  535.                 // Loop through the possible tools
  536.                 for(i = 1; i <= toolCount; i++)
  537.                 {
  538.                     keyPreference = "webdeveloper.tool." + i + ".key";
  539.                     url           = "webdeveloper.tool." + i + ".url";
  540.  
  541.                     // If the URL and key preferences are set
  542.                     if(preferencesService.prefHasUserValue(url) && preferencesService.prefHasUserValue(keyPreference))
  543.                     {
  544.                         keyPreferenceValue = preferencesService.getComplexValue(keyPreference, Components.interfaces.nsISupportsString).data.trim();
  545.  
  546.                         // If the key preference value is set
  547.                         if(keyPreferenceValue)
  548.                         {
  549.                             key = mainDocument.createElement("key");
  550.  
  551.                             key.setAttribute("id", keyPreference);
  552.                             key.setAttribute("key", keyPreferenceValue);
  553.                             key.setAttribute("modifiers", "accel,shift");
  554.                             key.setAttribute("oncommand", "webdeveloper_loadURL('" + preferencesService.getComplexValue(url, Components.interfaces.nsISupportsString).data.trim() + "' + escape(getBrowser().currentURI.spec))");
  555.                             keySet.appendChild(key);
  556.                         }
  557.                     }
  558.                 }
  559.             }
  560.         }
  561.     }
  562.  
  563.     return success;
  564. }
  565.  
  566. // Disables the extension
  567. function webdeveloper_disable(forceDisable)
  568. {
  569.     const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  570.     const stringBundle       = document.getElementById("webdeveloper-string-bundle");
  571.  
  572.     var disable     = true;
  573.     var element     = null;
  574.     var keys        = null;
  575.     var keySet      = document.getElementById("mainKeyset");
  576.     var textToolbar = false;
  577.  
  578.     // If the key set was not found
  579.     if(!keySet)
  580.     {
  581.         keySet = document.getElementById("navKeys");
  582.     }
  583.  
  584.     keys = keySet.childNodes;
  585.  
  586.     // If not forcing disable and the disable extension preference is set
  587.     if(!forceDisable && preferencesService.prefHasUserValue("webdeveloper.disabled"))
  588.     {
  589.         disable = !preferencesService.getBoolPref("webdeveloper.disabled");
  590.     }
  591.  
  592.     // If the toolbar preference has a value and is set to text
  593.     if(preferencesService.prefHasUserValue("webdeveloper.toolbar.icons") && preferencesService.getComplexValue("webdeveloper.toolbar.icons", Components.interfaces.nsISupportsString).data.trim() == "text")
  594.     {
  595.         textToolbar = true;
  596.     }
  597.  
  598.     preferencesService.setBoolPref("webdeveloper.disabled", disable);
  599.  
  600.     // Loop through the keys
  601.     for(var i = 0; i < keys.length; i++)
  602.     {
  603.         element = keys.item(i);
  604.  
  605.         // If the key has an id starting with webdeveloper
  606.         if(element.hasAttribute("id") && element.getAttribute("id").indexOf("webdeveloper") == 0)
  607.         {
  608.             webdeveloper_disableElement(element, disable);
  609.         }
  610.     }
  611.  
  612.     webdeveloper_disableElement(document.getElementById("webdeveloper-context"), disable);
  613.     webdeveloper_disableElement(document.getElementById("webdeveloper-menu"), disable);
  614.     webdeveloper_disableElement(document.getElementById("webdeveloper-edit-css-sidebar"), disable);
  615.  
  616.     webdeveloper_disableElement(document.getElementById("webdeveloper-disable-toolbar"), disable);
  617.     webdeveloper_disableElement(document.getElementById("webdeveloper-css-toolbar"), disable);
  618.     webdeveloper_disableElement(document.getElementById("webdeveloper-forms-toolbar"), disable);
  619.     webdeveloper_disableElement(document.getElementById("webdeveloper-images-toolbar"), disable);
  620.     webdeveloper_disableElement(document.getElementById("webdeveloper-information-toolbar"), disable);
  621.     webdeveloper_disableElement(document.getElementById("webdeveloper-miscellaneous-toolbar"), disable);
  622.     webdeveloper_disableElement(document.getElementById("webdeveloper-outline-toolbar"), disable);
  623.     webdeveloper_disableElement(document.getElementById("webdeveloper-resize-toolbar"), disable);
  624.     webdeveloper_disableElement(document.getElementById("webdeveloper-tools-toolbar"), disable);
  625.     webdeveloper_disableElement(document.getElementById("webdeveloper-view-source-toolbar"), disable);
  626.     webdeveloper_disableElement(document.getElementById("webdeveloper-options-toolbar"), disable);
  627.  
  628.     element = document.getElementById("webdeveloper-render-mode-statusbar");
  629.  
  630.     // If the element exists
  631.     if(element)
  632.     {
  633.         // If disabling
  634.         if(disable)
  635.         {
  636.             element.setAttribute("class", "webdeveloper-statusbar-button");
  637.             element.setAttribute("tooltiptext", stringBundle.getString("webdeveloper_standardsComplianceModeTooltip"));
  638.  
  639.             // If the toolbar is in text mode
  640.             if(textToolbar)
  641.             {
  642.                 element.setAttribute("label", stringBundle.getString("webdeveloper_standardsComplianceModeLabel"));
  643.             }
  644.         }
  645.         else
  646.         {
  647.             const selectedTab     = getBrowser().mTabBox.selectedIndex;
  648.             const currentDocument = getBrowser().browsers[selectedTab].contentWindow.document;
  649.  
  650.             webdeveloper_updateRenderMode(currentDocument);
  651.         }
  652.  
  653.         webdeveloper_disableElement(element, disable);
  654.     }
  655.  
  656.     element = document.getElementById("webdeveloper-javascript-statusbar");
  657.  
  658.     // If the element exists
  659.     if(element)
  660.     {
  661.         element.setAttribute("class", "webdeveloper-statusbar-button");
  662.         element.setAttribute("tooltiptext", stringBundle.getString("webdeveloper_javaScriptNoErrorsTooltip"));
  663.         webdeveloper_disableElement(element, disable);
  664.  
  665.         // If the toolbar is in text mode
  666.         if(textToolbar)
  667.         {
  668.             element.setAttribute("label", stringBundle.getString("webdeveloper_javaScriptNoErrorsLabel"));
  669.         }
  670.     }
  671.  
  672.     element = document.getElementById("sidebar-box");
  673.  
  674.     // If the element exists and is visible
  675.     if(element && !element.getAttribute("hidden"))
  676.     {
  677.         // If the element is showing the edit CSS sidebar
  678.         if(element.getAttribute("src") == "chrome://webdeveloper/content/sidebar/edit_css.xul")
  679.         {
  680.             toggleSidebar("webdeveloper-edit-css-sidebar");
  681.         }
  682.         else if(element.getAttribute("src") == "chrome://webdeveloper/content/sidebar/view_style_information.xul")
  683.         {
  684.             toggleSidebar("webdeveloper-view-style-information-sidebar");
  685.         }
  686.     }
  687.  
  688.     element = document.getElementById("webdeveloper-toggle-statusbar");
  689.  
  690.     // If the element exists
  691.     if(element)
  692.     {
  693.         // If disabling the extension
  694.         if(disable)
  695.         {
  696.             element.setAttribute("class", "enable webdeveloper-statusbar-button");
  697.             element.setAttribute("tooltiptext", stringBundle.getString("webdeveloper_enable"));
  698.         }
  699.         else
  700.         {
  701.             element.setAttribute("class", "webdeveloper-statusbar-button");
  702.             element.setAttribute("tooltiptext", stringBundle.getString("webdeveloper_disable"));
  703.         }
  704.     }
  705.  
  706.     // If disabling
  707.     if(disable)
  708.     {
  709.         // If already listening to the console
  710.         if(webdeveloper_javaScriptConsoleListener)
  711.         {
  712.             const consoleService = Components.classes["@mozilla.org/consoleservice;1"].getService().QueryInterface(Components.interfaces.nsIConsoleService);
  713.  
  714.             // Try to unregister the listener
  715.             try
  716.             {
  717.                 consoleService.unregisterListener(WebDeveloperJavaScriptConsoleListener);
  718.             }
  719.             catch(exception)
  720.             {
  721.                 // Do nothing
  722.             }
  723.  
  724.             webdeveloper_javaScriptConsoleListener = false;
  725.         }
  726.  
  727.         webdeveloper_resetPage();
  728.     }
  729. }
  730.  
  731. // Disables an element
  732. function webdeveloper_disableElement(element, disable)
  733. {
  734.     // If the element exists
  735.     if(element)
  736.     {
  737.         element.setAttribute("disabled", disable);
  738.     }
  739. }
  740.  
  741. // Disables the given preference
  742. function webdeveloper_disablePreference(element, preference)
  743. {
  744.     const checked            = element.getAttribute("checked");
  745.     const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  746.  
  747.     preferencesService.setBoolPref(preference, !checked);
  748.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  749. }
  750.  
  751. // Displays the elements ancestors in the status bar
  752. function webdeveloper_displayElementAncestors(event)
  753. {
  754.     const eventTarget = event.target;
  755.  
  756.     // If there is a target
  757.     if(eventTarget)
  758.     {
  759.         getBrowser().contentWindow.status = webdeveloper_getElementAncestors(eventTarget, "");
  760.  
  761.         event.preventDefault();
  762.     }
  763. }
  764.  
  765. // Enables the given preference
  766. function webdeveloper_enablePreference(element, preference)
  767. {
  768.     const checked            = element.getAttribute("checked");
  769.     const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  770.  
  771.     // If the element is checked - explicit if required
  772.     if(checked)
  773.     {
  774.         preferencesService.setBoolPref(preference, true);
  775.     }
  776.     else
  777.     {
  778.         preferencesService.setBoolPref(preference, false);
  779.     }
  780.  
  781.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  782. }
  783.  
  784. // Generates a page in a new tab or window
  785. function webdeveloper_generatePage(url)
  786. {
  787.     const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  788.  
  789.     var generatedPage = null;
  790.  
  791.     // If the open tabs preference is set to true
  792.     if(preferencesService.prefHasUserValue("webdeveloper.open.tabs") && preferencesService.getBoolPref("webdeveloper.open.tabs"))
  793.     {
  794.         const newTab = getBrowser().addTab(url);
  795.  
  796.         getBrowser().selectedTab = newTab;
  797.         generatedPage = window;
  798.     }
  799.     else
  800.     {
  801.         generatedPage = window.open(url);
  802.     }
  803.  
  804.     return generatedPage;
  805. }
  806.  
  807. // Get the cookies
  808. function webdeveloper_getCookies(host, sort)
  809. {
  810.     const cookieEnumeration = Components.classes["@mozilla.org/cookiemanager;1"].getService(Components.interfaces.nsICookieManager).enumerator;
  811.  
  812.     var cookies = new Array();
  813.  
  814.     // Loop through the cookies
  815.     while(cookieEnumeration.hasMoreElements())
  816.     {
  817.         const cookie = cookieEnumeration.getNext().QueryInterface(Components.interfaces.nsICookie);
  818.  
  819.         var cookieHost = cookie.host;
  820.  
  821.         // If there is a host for this cookie
  822.         if(cookieHost)
  823.         {
  824.             // If the cookie host starts with '.'
  825.             if(cookieHost.charAt(0) == ".")
  826.             {
  827.                 cookieHost = cookieHost.substring(1);
  828.             }
  829.  
  830.             // If the host and cookie host match
  831.             if(host == cookieHost || host.indexOf("." + cookieHost) != -1)
  832.             {
  833.                 cookies.push(cookie);
  834.             }
  835.         }
  836.     }
  837.  
  838.     // If sorting cookies
  839.     if(sort)
  840.     {
  841.         cookies.sort(webdeveloper_sortCookies);
  842.     }
  843.  
  844.     return cookies;
  845. }
  846.  
  847. // Gets all the documents from the current page
  848. function webdeveloper_getDocuments(frame, documentList)
  849. {
  850.     const framesList = frame.frames;
  851.  
  852.     documentList.push(frame.document);
  853.  
  854.     // Loop through the frames
  855.     for(var i = 0; i < framesList.length; i++)
  856.     {
  857.         webdeveloper_getDocuments(framesList[i], documentList);
  858.     }
  859.  
  860.     return documentList;
  861. }
  862.  
  863. // Get an elements ancestors
  864. function webdeveloper_getElementAncestors(element, ancestorList)
  865. {
  866.     const classAttribute = element.getAttribute("class");
  867.     const idAttribute    = element.getAttribute("id");
  868.     const parentElement  = element.parentNode;
  869.  
  870.     var elementText = element.tagName.toLowerCase();
  871.  
  872.     // If there is a class attribute
  873.     if(classAttribute)
  874.     {
  875.         elementText += "." + classAttribute;
  876.     }
  877.  
  878.     // If there is an id attribute
  879.     if(idAttribute)
  880.     {
  881.         elementText += "#" + idAttribute;
  882.     }
  883.  
  884.     // If there is an ancestor list
  885.     if(ancestorList)
  886.     {
  887.         elementText += " > " + ancestorList
  888.     }
  889.  
  890.     // If there is a parent element with a tag name
  891.     if(parentElement && parentElement.tagName)
  892.     {
  893.         return webdeveloper_getElementAncestors(parentElement, elementText);
  894.     }
  895.     else
  896.     {
  897.         return elementText;
  898.     }
  899. }
  900.  
  901. // Initializes the extension
  902. function webdeveloper_initialize()
  903. {
  904.     const content            = window.document.getElementById("content");
  905.     const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  906.  
  907.     webdeveloper_setupDefaultOptions();
  908.  
  909.     // If the debug preference is set
  910.     if(preferencesService.prefHasUserValue("webdeveloper.debug"))
  911.     {
  912.         webdeveloper_debug = preferencesService.getBoolPref("webdeveloper.debug");
  913.     }
  914.  
  915.     // If the content exists
  916.     if(content)
  917.     {
  918.         const tabBox = content.mTabBox;
  919.  
  920.         // Try to remove the event listener
  921.         try
  922.         {
  923.             tabBox.removeEventListener("select", webdeveloper_tabSelect, true);
  924.         }
  925.         catch(exception)
  926.         {
  927.             // Do nothing
  928.         }
  929.  
  930.         tabBox.addEventListener("select", webdeveloper_tabSelect, true);
  931.     }
  932.  
  933.     // Try to remove the load event listener
  934.     try
  935.     {
  936.         window.removeEventListener("load", webdeveloper_pageLoad, true);
  937.     }
  938.     catch(exception)
  939.     {
  940.         // Do nothing
  941.     }
  942.  
  943.     // Try to remove the unload event listener
  944.     try
  945.     {
  946.         window.removeEventListener("unload", webdeveloper_pageUnload, true);
  947.     }
  948.     catch(exception)
  949.     {
  950.         // Do nothing
  951.     }
  952.  
  953.     window.addEventListener("load", webdeveloper_pageLoad, true);
  954.     window.addEventListener("unload", webdeveloper_pageUnload, true);
  955. }
  956.  
  957. // Loads the given URL
  958. function webdeveloper_loadURL(url)
  959. {
  960.     const oldTab             = getBrowser().selectedTab;
  961.     const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  962.  
  963.     webdeveloper_generatePage(url);
  964.  
  965.     // If the open tabs in background preference is set to true
  966.     if(preferencesService.prefHasUserValue("webdeveloper.open.tabs.background") && preferencesService.getBoolPref("webdeveloper.open.tabs.background"))
  967.     {
  968.         getBrowser().selectedTab = oldTab;
  969.     }
  970. }
  971.  
  972. // Opens the JavaScript console
  973. function webdeveloper_openJavaScriptConsole()
  974. {
  975.     webdeveloper_javaScriptPreviousTime = webdeveloper_javaScriptCurrentTime;
  976.     webdeveloper_javaScriptCurrentTime  = new Date().getTime();
  977.  
  978.     // If the previous time is not set or the current time is greater than a second different from the previous time
  979.     if(!webdeveloper_javaScriptPreviousTime || webdeveloper_javaScriptCurrentTime - webdeveloper_javaScriptPreviousTime > 1000)
  980.     {
  981.         toJavaScriptConsole();
  982.     }
  983. }
  984.  
  985. // Displays the options dialog
  986. function webdeveloper_options()
  987. {
  988.     window.openDialog("chrome://webdeveloper/content/options/options.xul", "webdeveloper-options-dialog", "centerscreen,chrome,modal");
  989.  
  990.     webdeveloper_changeOptions();
  991. }
  992.  
  993. // Handles the page being loaded
  994. function webdeveloper_pageLoad(event)
  995. {
  996.     const eventTarget        = event.target;
  997.     const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  998.  
  999.     var disable = false;
  1000.  
  1001.     // If the disabled preference is set
  1002.     if(preferencesService.prefHasUserValue("webdeveloper.disabled"))
  1003.     {
  1004.         disable = preferencesService.getBoolPref("webdeveloper.disabled");
  1005.     }
  1006.  
  1007.     // If the page is the target
  1008.     if(eventTarget && eventTarget.hasAttribute && eventTarget.hasAttribute("id") && eventTarget.getAttribute("id").toLowerCase() == "content")
  1009.     {
  1010.         const stringBundle = document.getElementById("webdeveloper-string-bundle");
  1011.  
  1012.         webdeveloper_changeOptions();
  1013.  
  1014.         // If the extension should be disabled, but is not
  1015.         if(disable && document.getElementById("webdeveloper-toggle-statusbar").getAttribute("tooltiptext") == stringBundle.getString("webdeveloper_disable"))
  1016.         {
  1017.             webdeveloper_disable(true);
  1018.         }
  1019.         else if(!disable)
  1020.         {
  1021.             const contentDocument               = eventTarget.contentDocument;
  1022.             const disableCachePreference        = !preferencesService.getBoolPref("browser.cache.disk.enable") && !preferencesService.getBoolPref("browser.cache.memory.enable");
  1023.             const disableJavaPreference         = !preferencesService.getBoolPref("security.enable_java");
  1024.             const disableJavaScriptPreference   = !preferencesService.getBoolPref("javascript.enabled");
  1025.             const disablePageColorsPreference   = !preferencesService.getBoolPref("browser.display.use_document_colors");
  1026.             const disablePopupBlockerPreference = !preferencesService.getBoolPref("dom.disable_open_during_load");
  1027.             const loadedDocument                = event.originalTarget;
  1028.  
  1029.             var disableCookiesPreference         = false;
  1030.             var disableImagesPreference          = false;
  1031.             var disableImageAnimationsPreference = false;
  1032.             var disableReferrerPreference        = false;
  1033.             var element                          = null;
  1034.             var persistStyles                    = false;
  1035.  
  1036.             // If the localized options have not been setup
  1037.             if(!webdeveloper_localizedOptionsSetup)
  1038.             {
  1039.                 webdeveloper_setupLocalizedOptions();
  1040.             }
  1041.  
  1042.             // If not already listening to the console
  1043.             if(!webdeveloper_javaScriptConsoleListener)
  1044.             {
  1045.                 const consoleService = Components.classes["@mozilla.org/consoleservice;1"].getService().QueryInterface(Components.interfaces.nsIConsoleService);
  1046.  
  1047.                 // Try to unregister the listener
  1048.                 try
  1049.                 {
  1050.                     consoleService.unregisterListener(WebDeveloperJavaScriptConsoleListener);
  1051.                 }
  1052.                 catch(exception)
  1053.                 {
  1054.                     // Do nothing
  1055.                 }
  1056.  
  1057.                 consoleService.registerListener(WebDeveloperJavaScriptConsoleListener);
  1058.  
  1059.                 webdeveloper_javaScriptConsoleListener = true;
  1060.             }
  1061.  
  1062.             // Try to get the cookie preference
  1063.             try
  1064.             {
  1065.                 // If the preference is set to 2
  1066.                 if(preferencesService.getIntPref("network.cookie.cookieBehavior") == 2)
  1067.                 {
  1068.                     disableCookiesPreference = true;
  1069.                 }
  1070.             }
  1071.             catch(exception)
  1072.             {
  1073.                 disableCookiesPreference = !preferencesService.getBoolPref("network.cookie.enable");
  1074.             }
  1075.  
  1076.             // If the image animation preference is set to none
  1077.             if(preferencesService.getCharPref("image.animation_mode") == "none")
  1078.             {
  1079.                 disableImageAnimationsPreference = true;
  1080.             }
  1081.  
  1082.             // If the image preference exists and is set to 2
  1083.             if(preferencesService.prefHasUserValue("network.image.imageBehavior") && preferencesService.getIntPref("network.image.imageBehavior") == 2)
  1084.             {
  1085.                 disableImagesPreference = true;
  1086.             }
  1087.  
  1088.             // If the referrer preference is set to 0
  1089.             if(preferencesService.getIntPref("network.http.sendRefererHeader") == 0)
  1090.             {
  1091.                 disableReferrerPreference = true;
  1092.             }
  1093.  
  1094.             // If the DOM inspector is not available
  1095.             if(!Components.classes["@mozilla.org/inspector/dom-utils;1"])
  1096.             {
  1097.                 element = document.getElementById("webdeveloper-view-style-information-menu");
  1098.  
  1099.                 // If the view style information menu is enabled
  1100.                 if(!element.disabled)
  1101.                 {
  1102.                     webdeveloper_configureEquivalentElements(element, "disabled", true);
  1103.                 }
  1104.  
  1105.                 element = document.getElementById("webdeveloper-view-style-information-key");
  1106.  
  1107.                 // If the view style information key is enabled
  1108.                 if(!element.disabled)
  1109.                 {
  1110.                     webdeveloper_disableElement(element, true);
  1111.                 }
  1112.  
  1113.                 element = document.getElementById("webdeveloper-open-dom-inspector-menu");
  1114.  
  1115.                 // If the open DOM inspector menu is enabled
  1116.                 if(!element.disabled)
  1117.                 {
  1118.                     webdeveloper_configureEquivalentElements(element, "disabled", true);
  1119.                 }
  1120.             }
  1121.  
  1122.             element = document.getElementById("webdeveloper-disable-cache-menu");
  1123.             webdeveloper_configureEquivalentElements(element, "checked", disableCachePreference);
  1124.  
  1125.             element = document.getElementById("webdeveloper-disable-cookies-menu");
  1126.             webdeveloper_configureEquivalentElements(element, "checked", disableCookiesPreference);
  1127.  
  1128.             element = document.getElementById("webdeveloper-disable-image-animations-menu");
  1129.             webdeveloper_configureEquivalentElements(element, "checked", disableImageAnimationsPreference);
  1130.  
  1131.             element = document.getElementById("webdeveloper-disable-images-menu");
  1132.             webdeveloper_configureEquivalentElements(element, "checked", disableImagesPreference);
  1133.  
  1134.             element = document.getElementById("webdeveloper-disable-java-menu");
  1135.             webdeveloper_configureEquivalentElements(element, "checked", disableJavaPreference);
  1136.  
  1137.             element = document.getElementById("webdeveloper-disable-javascript-menu");
  1138.             webdeveloper_configureEquivalentElements(element, "checked", disableJavaScriptPreference);
  1139.  
  1140.             element = document.getElementById("webdeveloper-disable-page-colors-menu");
  1141.             webdeveloper_configureEquivalentElements(element, "checked", disablePageColorsPreference);
  1142.  
  1143.             element = document.getElementById("webdeveloper-disable-popup-blocker-menu");
  1144.             webdeveloper_configureEquivalentElements(element, "checked", disablePopupBlockerPreference);
  1145.  
  1146.             element = document.getElementById("webdeveloper-disable-referrer-logging-menu");
  1147.             webdeveloper_configureEquivalentElements(element, "checked", disableReferrerPreference);
  1148.  
  1149.             element = document.getElementById("webdeveloper-open-java-console-key");
  1150.             webdeveloper_configureEquivalentElements(element, "disabled", disableJavaPreference);
  1151.  
  1152.             element = document.getElementById("webdeveloper-open-java-console-menu");
  1153.             webdeveloper_configureEquivalentElements(element, "disabled", disableJavaPreference);
  1154.  
  1155.             // If the persist styles preference is set and is true
  1156.             if(preferencesService.prefHasUserValue("webdeveloper.styles.persist") && preferencesService.getBoolPref("webdeveloper.styles.persist"))
  1157.             {
  1158.                 persistStyles = true;
  1159.  
  1160.                 // If the loaded document is set
  1161.                 if(contentDocument)
  1162.                 {
  1163.                     webdeveloper_applyStyleSheets(true);
  1164.                     webdeveloper_updateRenderMode(contentDocument);
  1165.                 }
  1166.             }
  1167.             else if(contentDocument && loadedDocument && contentDocument.documentURI == loadedDocument.documentURI)
  1168.             {
  1169.                 webdeveloper_appliedStyles = new Array();
  1170.                 webdeveloper_resetMenu(true);
  1171.                 webdeveloper_updateRenderMode(contentDocument);
  1172.             }
  1173.  
  1174.             element = document.getElementById("webdeveloper-persist-styles-menu");
  1175.             webdeveloper_configureEquivalentElements(element, "checked", persistStyles);
  1176.         }
  1177.     }
  1178. }
  1179.  
  1180. // Handles the page being unloaded
  1181. function webdeveloper_pageUnload(event)
  1182. {
  1183.     const eventTarget    = event.target;
  1184.     const originalTarget = event.originalTarget;
  1185.  
  1186.     // If the page is the target and the URI matches
  1187.     if(eventTarget && originalTarget && eventTarget.contentDocument && eventTarget.hasAttribute && eventTarget.hasAttribute("id") && eventTarget.getAttribute("id").toLowerCase() == "content" && eventTarget.contentDocument.documentURI == originalTarget.documentURI)
  1188.     {
  1189.         webdeveloper_resetJavaScriptStatus();
  1190.     }
  1191. }
  1192.  
  1193. // Remove applied style
  1194. function webdeveloper_removeAppliedStyle(id)
  1195. {
  1196.     const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  1197.  
  1198.     // If the persist styles preference is set and is true
  1199.     if(preferencesService.prefHasUserValue("webdeveloper.styles.persist") && preferencesService.getBoolPref("webdeveloper.styles.persist"))
  1200.     {
  1201.         // Loop through the applied styles
  1202.         for(var i = 0; i < webdeveloper_appliedStyles.length; i++)
  1203.         {
  1204.             // If this style sheet is in the applied styles
  1205.             if(webdeveloper_appliedStyles[i] == id)
  1206.             {
  1207.                 webdeveloper_appliedStyles.splice(i, 1);
  1208.             }
  1209.         }
  1210.     }
  1211. }
  1212.  
  1213. // Removes all the generated menu items from the menu
  1214. function webdeveloper_removeGeneratedMenuItems(menu)
  1215. {
  1216.     var menuItem  = null;
  1217.     var menuItems = menu.getElementsByAttribute("class", "webdeveloper-generated-menu");
  1218.  
  1219.     // Loop through the menu items
  1220.     for(var i = 0; i < menuItems.length; i++)
  1221.     {
  1222.         menu.removeChild(menuItems[i]);
  1223.     }
  1224.  
  1225.     menuItems = menu.getElementsByAttribute("class", "webdeveloper-generated-menu");
  1226.  
  1227.     // Loop through the menu items again because of the change to the behavior of getElementsByAttribute
  1228.     while(menuItems.length > 0)
  1229.     {
  1230.         menu.removeChild(menuItems[0]);
  1231.     }
  1232. }
  1233.  
  1234. // Removes the style sheet with the given id
  1235. function webdeveloper_removeStyleSheet(id, applyStyle)
  1236. {
  1237.     const mainTabBox   = getBrowser().mTabBox;
  1238.     const documentList = webdeveloper_getDocuments(getBrowser().browsers[mainTabBox.selectedIndex].contentWindow, new Array());
  1239.  
  1240.     var element      = null;
  1241.     var pageDocument = null;
  1242.  
  1243.     // Loop through the documents
  1244.     for(var i = 0; i < documentList.length; i++)
  1245.     {
  1246.         pageDocument = documentList[i];
  1247.  
  1248.         // Remove all elements with that id
  1249.         while((element = pageDocument.getElementById(id)) != null)
  1250.         {
  1251.             element.parentNode.removeChild(element);
  1252.         }
  1253.     }
  1254.  
  1255.     // If applying style
  1256.     if(applyStyle)
  1257.     {
  1258.         webdeveloper_removeAppliedStyle(id);
  1259.     }
  1260. }
  1261.  
  1262. // Resets the JavaScript status button
  1263. function webdeveloper_resetJavaScriptStatus()
  1264. {
  1265.     const javaScriptButton = document.getElementById("webdeveloper-javascript-statusbar");
  1266.  
  1267.     webdeveloper_javaScriptCurrentTime  = null;
  1268.     webdeveloper_javaScriptPreviousTime = null;
  1269.  
  1270.     // If the JavaScript button exists
  1271.     if(javaScriptButton)
  1272.     {
  1273.         const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  1274.         const stringBundle       = document.getElementById("webdeveloper-string-bundle");
  1275.  
  1276.         javaScriptButton.setAttribute("class", "webdeveloper-statusbar-button");
  1277.         javaScriptButton.setAttribute("tooltiptext", stringBundle.getString("webdeveloper_javaScriptNoErrorsTooltip"));
  1278.  
  1279.         // If the toolbar preference has a value and is set to text
  1280.         if(preferencesService.prefHasUserValue("webdeveloper.toolbar.icons") && preferencesService.getComplexValue("webdeveloper.toolbar.icons", Components.interfaces.nsISupportsString).data.trim() == "text")
  1281.         {
  1282.             javaScriptButton.setAttribute("label", stringBundle.getString("webdeveloper_javaScriptNoErrorsLabel"));
  1283.         }
  1284.     }
  1285. }
  1286.  
  1287. // Resets the menu
  1288. function webdeveloper_resetMenu(disableStylesMenu)
  1289. {
  1290.     var element = document.getElementById("webdeveloper-add-user-style-sheet-menu");
  1291.  
  1292.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1293.  
  1294.     // If including the disable styles menu
  1295.     if(disableStylesMenu)
  1296.     {
  1297.         element = document.getElementById("webdeveloper-disable-all-styles-menu");
  1298.         webdeveloper_configureEquivalentElements(element, "checked", false);
  1299.         webdeveloper_configureEquivalentElements(element, "disabled", false);
  1300.  
  1301.         element = document.getElementById("webdeveloper-disable-embedded-styles-menu");
  1302.         webdeveloper_configureEquivalentElements(element, "checked", false);
  1303.         webdeveloper_configureEquivalentElements(element, "disabled", false);
  1304.  
  1305.         element = document.getElementById("webdeveloper-disable-inline-styles-menu");
  1306.         webdeveloper_configureEquivalentElements(element, "checked", false);
  1307.         webdeveloper_configureEquivalentElements(element, "disabled", false);
  1308.  
  1309.         element = document.getElementById("webdeveloper-disable-linked-styles-menu");
  1310.         webdeveloper_configureEquivalentElements(element, "checked", false);
  1311.         webdeveloper_configureEquivalentElements(element, "disabled", false);
  1312.     }
  1313.  
  1314.     element = document.getElementById("webdeveloper-disable-default-styles-menu");
  1315.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1316.  
  1317.     element = document.getElementById("webdeveloper-disable-embedded-styles-menu");
  1318.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1319.  
  1320.     element = document.getElementById("webdeveloper-disable-inline-styles-menu");
  1321.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1322.  
  1323.     element = document.getElementById("webdeveloper-display-access-keys-menu");
  1324.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1325.  
  1326.     element = document.getElementById("webdeveloper-display-anchors-menu");
  1327.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1328.  
  1329.     element = document.getElementById("webdeveloper-display-block-size-menu");
  1330.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1331.  
  1332.     element = document.getElementById("webdeveloper-display-current-size-title-menu");
  1333.  
  1334.     // If the display current size in title menu is checked
  1335.     if(element.getAttribute("checked"))
  1336.     {
  1337.         window.onresize = null;
  1338.     }
  1339.  
  1340.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1341.  
  1342.     element = document.getElementById("webdeveloper-display-form-details-menu");
  1343.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1344.  
  1345.     element = document.getElementById("webdeveloper-display-id-class-details-menu");
  1346.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1347.  
  1348.     element = document.getElementById("webdeveloper-display-image-dimensions-menu");
  1349.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1350.  
  1351.     element = document.getElementById("webdeveloper-display-image-file-sizes-menu");
  1352.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1353.  
  1354.     element = document.getElementById("webdeveloper-display-image-paths-menu");
  1355.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1356.  
  1357.     element = document.getElementById("webdeveloper-display-link-paths-menu");
  1358.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1359.  
  1360.     element = document.getElementById("webdeveloper-display-tab-index-menu");
  1361.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1362.  
  1363.     element = document.getElementById("webdeveloper-display-topographic-information-menu");
  1364.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1365.  
  1366.     element = document.getElementById("webdeveloper-hide-background-images-menu");
  1367.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1368.  
  1369.     element = document.getElementById("webdeveloper-hide-images-menu");
  1370.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1371.  
  1372.     element = document.getElementById("webdeveloper-linearize-page-menu");
  1373.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1374.  
  1375.     element = document.getElementById("webdeveloper-make-images-invisible-menu");
  1376.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1377.  
  1378.     element = document.getElementById("webdeveloper-outline-block-level-elements-menu");
  1379.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1380.  
  1381.     element = document.getElementById("webdeveloper-outline-custom-elements-menu");
  1382.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1383.  
  1384.     element = document.getElementById("webdeveloper-outline-deprecated-elements-menu");
  1385.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1386.  
  1387.     element = document.getElementById("webdeveloper-outline-frames-menu");
  1388.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1389.  
  1390.     element = document.getElementById("webdeveloper-outline-images-with-adjusted-dimensions-menu");
  1391.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1392.  
  1393.     element = document.getElementById("webdeveloper-outline-images-with-empty-alt-attributes-menu");
  1394.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1395.  
  1396.     element = document.getElementById("webdeveloper-outline-images-without-alt-attributes-menu");
  1397.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1398.  
  1399.     element = document.getElementById("webdeveloper-outline-images-without-dimensions-menu");
  1400.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1401.  
  1402.     element = document.getElementById("webdeveloper-outline-images-without-title-attributes-menu");
  1403.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1404.  
  1405.     element = document.getElementById("webdeveloper-outline-links-without-title-attributes-menu");
  1406.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1407.  
  1408.     element = document.getElementById("webdeveloper-outline-table-cells-menu");
  1409.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1410.  
  1411.     element = document.getElementById("webdeveloper-outline-tables-menu");
  1412.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1413.  
  1414.     element = document.getElementById("webdeveloper-replace-images-with-alt-attributes-menu");
  1415.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1416.  
  1417.     element = document.getElementById("webdeveloper-show-comments-menu");
  1418.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1419.  
  1420.     element = document.getElementById("webdeveloper-use-border-box-model-menu");
  1421.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1422.  
  1423.     element = document.getElementById("webdeveloper-view-style-information-menu");
  1424.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1425. }
  1426.  
  1427. // Resets the page
  1428. function webdeveloper_resetPage()
  1429. {
  1430.     const selectedTab     = getBrowser().mTabBox.selectedIndex;
  1431.     const currentDocument = getBrowser().browsers[selectedTab].contentWindow.document;
  1432.  
  1433.     webdeveloper_resetMenu(true);
  1434.     webdeveloper_applyStyleSheets(false);
  1435.  
  1436.     webdeveloper_appliedStyles    = new Array();
  1437.     webdeveloper_outlinedElements = new Array();
  1438. }
  1439.  
  1440. // Retrieves the style sheet text from a style sheet
  1441. function webdeveloper_retrieveStyleSheetText(pageDocument, styleSheet)
  1442. {
  1443.     const mediaList      = styleSheet.media.mediaText;
  1444.     const ownerNode      = styleSheet.ownerNode;
  1445.     const request        = new XMLHttpRequest();
  1446.     const styleSheetHref = styleSheet.href;
  1447.  
  1448.     var cssRule    = null;
  1449.     var stylesText = "";
  1450.  
  1451.     // If this style sheet is for the screen and is not an alternate style sheet
  1452.     if((!mediaList || mediaList.indexOf("screen") != -1 || mediaList.indexOf("all") != -1) && (!ownerNode || !ownerNode.hasAttribute("rel") || ownerNode.getAttribute("rel").toLowerCase() != "alternate stylesheet"))
  1453.     {
  1454.         // If the style sheet href is the current document
  1455.         if(styleSheetHref == pageDocument.documentURI)
  1456.         {
  1457.             const stringBundle = document.getElementById("webdeveloper-string-bundle");
  1458.  
  1459.             stylesText += "/* " + stringBundle.getFormattedString("webdeveloper_inlineStyles", [styleSheetHref]) + " */\n\n";
  1460.  
  1461.             // Loop through the the style sheet rules
  1462.             for(var k = 0; k < styleSheet.cssRules.length; k++)
  1463.             {
  1464.                 cssRule = styleSheet.cssRules[k];
  1465.  
  1466.                 // If this is not an import rule
  1467.                 if(cssRule.type != 3)
  1468.                 {
  1469.                     stylesText += cssRule.cssText + "\n\n";
  1470.                 }
  1471.             }
  1472.         }
  1473.         else
  1474.         {
  1475.             request.open("get", styleSheetHref, false);
  1476.             request.send("");
  1477.  
  1478.             stylesText += "/*  " + styleSheetHref + " */\n\n";
  1479.             stylesText += request.responseText;
  1480.         }
  1481.  
  1482.         // Loop through the the style sheet rules
  1483.         for(k = 0; k < styleSheet.cssRules.length; k++)
  1484.         {
  1485.             cssRule = styleSheet.cssRules[k];
  1486.  
  1487.             // If this is an import rule
  1488.             if(cssRule.type == 3)
  1489.             {
  1490.                 stylesText += webdeveloper_retrieveStyleSheetText(pageDocument, cssRule.styleSheet);
  1491.             }
  1492.         }
  1493.     }
  1494.  
  1495.     return stylesText;
  1496. }
  1497.  
  1498. // Sets up the default options
  1499. function webdeveloper_setupDefaultOptions()
  1500. {
  1501.     const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  1502.     const string             = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
  1503.  
  1504.     // If the open tabs preference is not set
  1505.     if(!preferencesService.prefHasUserValue("webdeveloper.open.tabs"))
  1506.     {
  1507.         // If the open windows preference is set
  1508.         if(preferencesService.prefHasUserValue("webdeveloper.open.windows"))
  1509.         {
  1510.             preferencesService.setBoolPref("webdeveloper.open.tabs", !preferencesService.getBoolPref("webdeveloper.open.windows"));
  1511.             preferencesService.clearUserPref("webdeveloper.open.windows");
  1512.         }
  1513.         else
  1514.         {
  1515.             preferencesService.setBoolPref("webdeveloper.open.tabs", true);
  1516.         }
  1517.     }
  1518.  
  1519.     // Set default edit CSS settings
  1520.     if(!preferencesService.prefHasUserValue("webdeveloper.edit.css.font"))
  1521.     {
  1522.         preferencesService.setIntPref("webdeveloper.edit.css.font", 12);
  1523.     }
  1524.     if(!preferencesService.prefHasUserValue("webdeveloper.edit.css.color.text"))
  1525.     {
  1526.         string.data = "#000000";
  1527.  
  1528.         preferencesService.setComplexValue("webdeveloper.edit.css.color.text", Components.interfaces.nsISupportsString, string);
  1529.     }
  1530.     if(!preferencesService.prefHasUserValue("webdeveloper.edit.css.color.background"))
  1531.     {
  1532.         string.data = "#ffffff";
  1533.  
  1534.         preferencesService.setComplexValue("webdeveloper.edit.css.color.background", Components.interfaces.nsISupportsString, string);
  1535.     }
  1536.     if(!preferencesService.prefHasUserValue("webdeveloper.edit.css.update.frequency"))
  1537.     {
  1538.         preferencesService.setIntPref("webdeveloper.edit.css.update.frequency", 1000);
  1539.     }
  1540.  
  1541.     // Set default custom colors
  1542.     if(!preferencesService.prefHasUserValue("webdeveloper.custom.1.color"))
  1543.     {
  1544.         string.data = "#ff0000";
  1545.  
  1546.         preferencesService.setComplexValue("webdeveloper.custom.1.color", Components.interfaces.nsISupportsString, string);
  1547.     }
  1548.     if(!preferencesService.prefHasUserValue("webdeveloper.custom.2.color"))
  1549.     {
  1550.         string.data = "#33ff33";
  1551.  
  1552.         preferencesService.setComplexValue("webdeveloper.custom.2.color", Components.interfaces.nsISupportsString, string);
  1553.     }
  1554.     if(!preferencesService.prefHasUserValue("webdeveloper.custom.3.color"))
  1555.     {
  1556.         string.data = "#3333ff";
  1557.  
  1558.         preferencesService.setComplexValue("webdeveloper.custom.3.color", Components.interfaces.nsISupportsString, string);
  1559.     }
  1560.     if(!preferencesService.prefHasUserValue("webdeveloper.custom.4.color"))
  1561.     {
  1562.         string.data = "#ff0000";
  1563.  
  1564.         preferencesService.setComplexValue("webdeveloper.custom.4.color", Components.interfaces.nsISupportsString, string);
  1565.     }
  1566.     if(!preferencesService.prefHasUserValue("webdeveloper.custom.5.color"))
  1567.     {
  1568.         string.data = "#33ff33";
  1569.  
  1570.         preferencesService.setComplexValue("webdeveloper.custom.5.color", Components.interfaces.nsISupportsString, string);
  1571.     }
  1572.  
  1573.     // Set default feature tooltip colors
  1574.     if(!preferencesService.prefHasUserValue("webdeveloper.color.feature.tooltip.text"))
  1575.     {
  1576.         string.data = "#000000";
  1577.  
  1578.         preferencesService.setComplexValue("webdeveloper.color.feature.tooltip.text", Components.interfaces.nsISupportsString, string);
  1579.     }
  1580.     if(!preferencesService.prefHasUserValue("webdeveloper.color.feature.tooltip.background"))
  1581.     {
  1582.         string.data = "#ffff99";
  1583.  
  1584.         preferencesService.setComplexValue("webdeveloper.color.feature.tooltip.background", Components.interfaces.nsISupportsString, string);
  1585.     }
  1586.     if(!preferencesService.prefHasUserValue("webdeveloper.feature.tooltip.opacity"))
  1587.     {
  1588.         string.data = "0.7";
  1589.  
  1590.         preferencesService.setComplexValue("webdeveloper.feature.tooltip.opacity", Components.interfaces.nsISupportsString, string);
  1591.     }
  1592.  
  1593.     // Set default ID & class colors
  1594.     if(!preferencesService.prefHasUserValue("webdeveloper.color.class.text"))
  1595.     {
  1596.         string.data = "#ffffff";
  1597.  
  1598.         preferencesService.setComplexValue("webdeveloper.color.class.text", Components.interfaces.nsISupportsString, string);
  1599.     }
  1600.     if(!preferencesService.prefHasUserValue("webdeveloper.color.class.background"))
  1601.     {
  1602.         string.data = "#990000";
  1603.  
  1604.         preferencesService.setComplexValue("webdeveloper.color.class.background", Components.interfaces.nsISupportsString, string);
  1605.     }
  1606.     if(!preferencesService.prefHasUserValue("webdeveloper.color.id.text"))
  1607.     {
  1608.         string.data = "#ffffff";
  1609.  
  1610.         preferencesService.setComplexValue("webdeveloper.color.id.text", Components.interfaces.nsISupportsString, string);
  1611.     }
  1612.     if(!preferencesService.prefHasUserValue("webdeveloper.color.id.background"))
  1613.     {
  1614.         string.data = "#009900";
  1615.  
  1616.         preferencesService.setComplexValue("webdeveloper.color.id.background", Components.interfaces.nsISupportsString, string);
  1617.     }
  1618.     if(!preferencesService.prefHasUserValue("webdeveloper.color.id.class.text"))
  1619.     {
  1620.         string.data = "#ffffff";
  1621.  
  1622.         preferencesService.setComplexValue("webdeveloper.color.id.class.text", Components.interfaces.nsISupportsString, string);
  1623.     }
  1624.     if(!preferencesService.prefHasUserValue("webdeveloper.color.id.class.background"))
  1625.     {
  1626.         string.data = "#000099";
  1627.  
  1628.         preferencesService.setComplexValue("webdeveloper.color.id.class.background", Components.interfaces.nsISupportsString, string);
  1629.     }
  1630.  
  1631.     // Set default populate form fields email
  1632.     if(!preferencesService.prefHasUserValue("webdeveloper.populate.form.fields.email"))
  1633.     {
  1634.         string.data = "noemail@noemail.org";
  1635.  
  1636.         preferencesService.setComplexValue("webdeveloper.populate.form.fields.email", Components.interfaces.nsISupportsString, string);
  1637.     }
  1638.  
  1639.     // Set default tidied HTML settings
  1640.     if(!preferencesService.prefHasUserValue("webdeveloper.tidied.html.close.br"))
  1641.     {
  1642.         preferencesService.setBoolPref("webdeveloper.tidied.html.close.br", true);
  1643.     }
  1644.     if(!preferencesService.prefHasUserValue("webdeveloper.tidied.html.escape.ampersand"))
  1645.     {
  1646.         preferencesService.setBoolPref("webdeveloper.tidied.html.escape.ampersand", true);
  1647.     }
  1648. }
  1649.  
  1650. // Sets up the localized options
  1651. function webdeveloper_setupLocalizedOptions()
  1652. {
  1653.     const stringBundle = document.getElementById("webdeveloper-string-bundle");
  1654.  
  1655.     // If the string bundle is set
  1656.     if(stringBundle)
  1657.     {
  1658.         const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  1659.         const string             = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
  1660.  
  1661.         // Set default resize sizes
  1662.         if(!preferencesService.prefHasUserValue("webdeveloper.resize.count"))
  1663.         {
  1664.             preferencesService.setIntPref("webdeveloper.resize.count", 1);
  1665.         }
  1666.         if(!preferencesService.prefHasUserValue("webdeveloper.resize.1.description"))
  1667.         {
  1668.             string.data = stringBundle.getString("webdeveloper_resize800x600");
  1669.  
  1670.             preferencesService.setComplexValue("webdeveloper.resize.1.description", Components.interfaces.nsISupportsString, string);
  1671.         }
  1672.         if(!preferencesService.prefHasUserValue("webdeveloper.resize.1.width"))
  1673.         {
  1674.             preferencesService.setIntPref("webdeveloper.resize.1.width", 800);
  1675.         }
  1676.         if(!preferencesService.prefHasUserValue("webdeveloper.resize.1.height"))
  1677.         {
  1678.             preferencesService.setIntPref("webdeveloper.resize.1.height", 600);
  1679.         }
  1680.  
  1681.         // Set default tool count
  1682.         if(!preferencesService.prefHasUserValue("webdeveloper.tool.count"))
  1683.         {
  1684.             preferencesService.setIntPref("webdeveloper.tool.count", 7);
  1685.         }
  1686.  
  1687.         // Set CSS validator
  1688.         if(!preferencesService.prefHasUserValue("webdeveloper.tool.1.description"))
  1689.         {
  1690.             string.data = stringBundle.getString("webdeveloper_validateCSS");
  1691.  
  1692.             preferencesService.setComplexValue("webdeveloper.tool.1.description", Components.interfaces.nsISupportsString, string);
  1693.  
  1694.         }
  1695.         if(!preferencesService.prefHasUserValue("webdeveloper.tool.1.url"))
  1696.         {
  1697.             string.data = "http://jigsaw.w3.org/css-validator/validator?profile=css2&warning=2&uri=";
  1698.  
  1699.             preferencesService.setComplexValue("webdeveloper.tool.1.url", Components.interfaces.nsISupportsString, string);
  1700.         }
  1701.  
  1702.         // Set feed validator
  1703.         if(!preferencesService.prefHasUserValue("webdeveloper.tool.2.description"))
  1704.         {
  1705.             string.data = stringBundle.getString("webdeveloper_validateFeed");
  1706.  
  1707.             preferencesService.setComplexValue("webdeveloper.tool.2.description", Components.interfaces.nsISupportsString, string);
  1708.         }
  1709.         if(!preferencesService.prefHasUserValue("webdeveloper.tool.2.url"))
  1710.         {
  1711.             string.data = "http://feedvalidator.org/check.cgi?url=";
  1712.  
  1713.             preferencesService.setComplexValue("webdeveloper.tool.2.url", Components.interfaces.nsISupportsString, string);
  1714.         }
  1715.  
  1716.         // Set HTML validator
  1717.         if(!preferencesService.prefHasUserValue("webdeveloper.tool.3.description"))
  1718.         {
  1719.             string.data = stringBundle.getString("webdeveloper_validateHTML");
  1720.  
  1721.             preferencesService.setComplexValue("webdeveloper.tool.3.description", Components.interfaces.nsISupportsString, string);
  1722.         }
  1723.         if(!preferencesService.prefHasUserValue("webdeveloper.tool.3.key"))
  1724.         {
  1725.             string.data = "H";
  1726.  
  1727.             preferencesService.setComplexValue("webdeveloper.tool.3.key", Components.interfaces.nsISupportsString, string);
  1728.         }
  1729.         if(!preferencesService.prefHasUserValue("webdeveloper.tool.3.url"))
  1730.         {
  1731.             string.data = "http://validator.w3.org/check?verbose=1&uri=";
  1732.  
  1733.             preferencesService.setComplexValue("webdeveloper.tool.3.url", Components.interfaces.nsISupportsString, string);
  1734.         }
  1735.  
  1736.         // Set links validator
  1737.         if(!preferencesService.prefHasUserValue("webdeveloper.tool.4.description"))
  1738.         {
  1739.             string.data = stringBundle.getString("webdeveloper_validateLinks");
  1740.  
  1741.             preferencesService.setComplexValue("webdeveloper.tool.4.description", Components.interfaces.nsISupportsString, string);
  1742.         }
  1743.         if(!preferencesService.prefHasUserValue("webdeveloper.tool.4.url"))
  1744.         {
  1745.             string.data = "http://validator.w3.org/checklink?check=Check&hide_type=all&summary=on&uri=";
  1746.  
  1747.             preferencesService.setComplexValue("webdeveloper.tool.4.url", Components.interfaces.nsISupportsString, string);
  1748.         }
  1749.  
  1750.         // Set section 508 validator
  1751.         if(!preferencesService.prefHasUserValue("webdeveloper.tool.5.description"))
  1752.         {
  1753.             string.data = stringBundle.getString("webdeveloper_validateSection508");
  1754.  
  1755.             preferencesService.setComplexValue("webdeveloper.tool.5.description", Components.interfaces.nsISupportsString, string);
  1756.         }
  1757.         if(!preferencesService.prefHasUserValue("webdeveloper.tool.5.url"))
  1758.         {
  1759.             string.data = "http://www.contentquality.com/mynewtester/cynthia.exe?rptmode=-1&url1=";
  1760.  
  1761.             preferencesService.setComplexValue("webdeveloper.tool.5.url", Components.interfaces.nsISupportsString, string);
  1762.         }
  1763.  
  1764.         // Set WAI validator
  1765.         if(!preferencesService.prefHasUserValue("webdeveloper.tool.6.description"))
  1766.         {
  1767.             string.data = stringBundle.getString("webdeveloper_validateWAI");
  1768.  
  1769.             preferencesService.setComplexValue("webdeveloper.tool.6.description", Components.interfaces.nsISupportsString, string);
  1770.         }
  1771.         if(!preferencesService.prefHasUserValue("webdeveloper.tool.6.url"))
  1772.         {
  1773.             string.data = "http://www.contentquality.com/mynewtester/cynthia.exe?rptmode=2&url1=";
  1774.  
  1775.             preferencesService.setComplexValue("webdeveloper.tool.6.url", Components.interfaces.nsISupportsString, string);
  1776.         }
  1777.  
  1778.         // Set speed report
  1779.         if(!preferencesService.prefHasUserValue("webdeveloper.tool.7.description"))
  1780.         {
  1781.             string.data = stringBundle.getString("webdeveloper_viewSpeedReport");
  1782.  
  1783.             preferencesService.setComplexValue("webdeveloper.tool.7.description", Components.interfaces.nsISupportsString, string);
  1784.         }
  1785.         if(!preferencesService.prefHasUserValue("webdeveloper.tool.7.url"))
  1786.         {
  1787.             string.data = "http://www.websiteoptimization.com/cgi-bin/wso/wso.pl?url=";
  1788.  
  1789.             preferencesService.setComplexValue("webdeveloper.tool.7.url", Components.interfaces.nsISupportsString, string);
  1790.         }
  1791.  
  1792.         webdeveloper_localizedOptionsSetup = true;
  1793.     }
  1794. }
  1795.  
  1796. // Sorts two cookies
  1797. function webdeveloper_sortCookies(cookieOne, cookieTwo)
  1798. {
  1799.     const cookieOneHost = cookieOne.host;
  1800.     const cookieOneName = cookieOne.name;
  1801.     const cookieTwoHost = cookieTwo.host;
  1802.     const cookieTwoName = cookieOne.name;
  1803.  
  1804.     var sortValue = 1;
  1805.  
  1806.     // If the cookies are equal
  1807.     if(cookieOneHost == cookieTwoHost && cookieOneName == cookieTwoName)
  1808.     {
  1809.         sortValue = 0;
  1810.     }
  1811.     else if(cookieOneHost < cookieTwoHost || (cookieOneHost == cookieTwoHost && cookieOneName < cookieTwoName))
  1812.     {
  1813.         sortValue = -1;
  1814.     }
  1815.  
  1816.     return sortValue;
  1817. }
  1818.  
  1819. // Handles a tab being selected
  1820. function webdeveloper_tabSelect(event)
  1821. {
  1822.     const selectedTab     = getBrowser().mTabBox.selectedIndex;
  1823.     const currentDocument = getBrowser().browsers[selectedTab].contentWindow.document;
  1824.  
  1825.     // If the selected tab is different
  1826.     if(selectedTab != webdeveloper_selectedTab)
  1827.     {
  1828.         const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  1829.  
  1830.         webdeveloper_selectedTab = selectedTab;
  1831.  
  1832.         webdeveloper_updateMenu(currentDocument);
  1833.         webdeveloper_updateRenderMode(currentDocument);
  1834.         webdeveloper_resetJavaScriptStatus();
  1835.     }
  1836. }
  1837.  
  1838. // Toggles the feature tooltip styles
  1839. function webdeveloper_toggleFeatureTooltipStyles(element, styleSheetId, selectors)
  1840. {
  1841.     webdeveloper_removeStyleSheet(styleSheetId, false);
  1842.  
  1843.     // If the menu is checked
  1844.     if(element.getAttribute("checked"))
  1845.     {
  1846.         const mainTabBox         = getBrowser().mTabBox;
  1847.         const documentList       = webdeveloper_getDocuments(getBrowser().browsers[mainTabBox.selectedIndex].contentWindow, new Array());
  1848.         const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  1849.         const colors             = " background-color: " + preferencesService.getComplexValue("webdeveloper.color.feature.tooltip.background", Components.interfaces.nsISupportsString).data.trim() + " !important; color: " + preferencesService.getComplexValue("webdeveloper.color.feature.tooltip.text", Components.interfaces.nsISupportsString).data.trim() + " !important; ";
  1850.         const opacity            = " -moz-opacity: " + preferencesService.getComplexValue("webdeveloper.feature.tooltip.opacity", Components.interfaces.nsISupportsString).data.trim() + " !important; ";
  1851.  
  1852.         var headElementList = null;
  1853.         var pageDocument    = null;
  1854.         var styleElement    = null;
  1855.  
  1856.         // Loop through the documents
  1857.         for(var i = 0; i < documentList.length; i++)
  1858.         {
  1859.             pageDocument    = documentList[i];
  1860.             headElementList = pageDocument.getElementsByTagName("head");
  1861.             styleElement    = pageDocument.createElement("style");
  1862.  
  1863.             styleElement.appendChild(pageDocument.createTextNode(selectors + " {" + colors + opacity + "}"));
  1864.             styleElement.setAttribute("id", styleSheetId);
  1865.             styleElement.setAttribute("type", "text/css");
  1866.  
  1867.             // If there is a head element
  1868.             if(headElementList.length > 0)
  1869.             {
  1870.                 headElementList[0].appendChild(styleElement);
  1871.             }
  1872.             else
  1873.             {
  1874.                 pageDocument.documentElement.appendChild(styleElement);
  1875.             }
  1876.         }
  1877.     }
  1878. }
  1879.  
  1880. // Toggles an individual style sheet
  1881. function webdeveloper_toggleIndividualStyleSheet(selectedStyleSheetHref)
  1882. {
  1883.     const mainTabBox      = getBrowser().mTabBox;
  1884.     const currentDocument = getBrowser().browsers[mainTabBox.selectedIndex].contentDocument;
  1885.  
  1886.     var styleSheet     = null;
  1887.     var styleSheetHref = null;
  1888.     var styleSheetList = currentDocument.styleSheets;
  1889.  
  1890.     // Loop through the style sheets
  1891.     for(var i = 0; i < styleSheetList.length; i++)
  1892.     {
  1893.         styleSheet     = styleSheetList[i];
  1894.         styleSheetHref = styleSheet.href;
  1895.  
  1896.         // If this is the selected style sheet
  1897.         if(styleSheetHref == selectedStyleSheetHref)
  1898.         {
  1899.             styleSheet.disabled = !styleSheet.disabled;
  1900.         }
  1901.     }
  1902. }
  1903.  
  1904. // Toggles the style sheet with the given id
  1905. function webdeveloper_toggleStyleSheet(element, location, id, applyStyle)
  1906. {
  1907.     const checked = element.getAttribute("checked");
  1908.  
  1909.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1910.     webdeveloper_removeStyleSheet(id, applyStyle);
  1911.  
  1912.     // If the menu is checked
  1913.     if(checked)
  1914.     {
  1915.         webdeveloper_addStyleSheet(location, id, applyStyle);
  1916.     }
  1917. }
  1918.  
  1919. // Toggles the toolbar
  1920. function webdeveloper_toggleToolbar()
  1921. {
  1922.     const toolbar = document.getElementById("webdeveloper-toolbar");
  1923.  
  1924.     toolbar.collapsed = !toolbar.collapsed;
  1925. }
  1926.  
  1927. // Updates the menu
  1928. function webdeveloper_updateMenu(currentDocument)
  1929. {
  1930.     const addUserStylesheet                             = currentDocument.getElementById("webdeveloper-add-user-style-sheet");
  1931.     const disableDefaultStylesStylesheet                = currentDocument.getElementById("webdeveloper-disable-default-styles");
  1932.     const displayAccessKeysStylesheet                   = currentDocument.getElementById("webdeveloper-display-access-keys");
  1933.     const displayAnchorsStylesheet                      = currentDocument.getElementById("webdeveloper-display-anchors");
  1934.     const displayBlockSizeStylesheet                    = currentDocument.getElementById("webdeveloper-display-block-size");
  1935.     const displayCurrentSizeTitleStylesheet             = currentDocument.getElementById("webdeveloper-display-current-size-title");
  1936.     const displayFormDetailsStylesheet                  = currentDocument.getElementById("webdeveloper-display-form-details");
  1937.     const displayIDClassDetailsStylesheet               = currentDocument.getElementById("webdeveloper-display-id-class-details");
  1938.     const displayImageDimensionsStylesheet              = currentDocument.getElementById("webdeveloper-display-image-dimensions");
  1939.     const displayImageFileSizesStylesheet               = currentDocument.getElementById("webdeveloper-display-image-file-sizes");
  1940.     const displayImagePathsStylesheet                   = currentDocument.getElementById("webdeveloper-display-image-paths");
  1941.     const displayLinkPathsStylesheet                    = currentDocument.getElementById("webdeveloper-display-link-paths");
  1942.     const displayTabIndexStylesheet                     = currentDocument.getElementById("webdeveloper-display-tab-index");
  1943.     const displayTopographicInformationStylesheet       = currentDocument.getElementById("webdeveloper-display-tab-index");
  1944.     const hideBackgroundImagesStylesheet                = currentDocument.getElementById("webdeveloper-hide-background-images");
  1945.     const hideImagesStylesheet                          = currentDocument.getElementById("webdeveloper-hide-images");
  1946.     const linearizePageStylesheet                       = currentDocument.getElementById("webdeveloper-linearize-page");
  1947.     const makeImagesInvisibleStylesheet                 = currentDocument.getElementById("webdeveloper-make-images-invisible");
  1948.     const outlineBlockLevelElementsStylesheet           = currentDocument.getElementById("webdeveloper-outline-block-level-elements");
  1949.     const outlineCustomElementsStylesheet               = currentDocument.getElementById("webdeveloper-outline-custom-elements");
  1950.     const outlineDeprecatedElementsStylesheet           = currentDocument.getElementById("webdeveloper-outline-deprecated-elements");
  1951.     const outlineFramesStylesheet                       = currentDocument.getElementById("webdeveloper-outline-frames");
  1952.     const outlineImagesWithAdjustedDimensionsStylesheet = currentDocument.getElementById("webdeveloper-outline-images-with-adjusted-dimensions");
  1953.     const outlineImagesWithEmptyAltAttributesStylesheet = currentDocument.getElementById("webdeveloper-outline-images-with-empty-alt-attributes");
  1954.     const outlineImagesWithoutAltAttributesStylesheet   = currentDocument.getElementById("webdeveloper-outline-images-without-alt-attributes");
  1955.     const outlineImagesWithoutDimensionsStylesheet      = currentDocument.getElementById("webdeveloper-outline-images-without-dimensions");
  1956.     const outlineImagesWithoutTitleAttributesStylesheet = currentDocument.getElementById("webdeveloper-outline-images-without-title-attributes");
  1957.     const outlineLinksWithoutTitleAttributesStylesheet  = currentDocument.getElementById("webdeveloper-outline-links-without-title-attributes");
  1958.     const outlineSelectedElementStylesheet              = currentDocument.getElementById("webdeveloper-outline-selected-element");
  1959.     const outlineTableCellsStylesheet                   = currentDocument.getElementById("webdeveloper-outline-table-cells");
  1960.     const outlineTablesStylesheet                       = currentDocument.getElementById("webdeveloper-outline-tables");
  1961.     const replaceImagesWithAltAttributesStylesheet      = currentDocument.getElementById("webdeveloper-replace-images-with-alt-attributes");
  1962.     const showCommentsStylesheet                        = currentDocument.getElementById("webdeveloper-show-comments");
  1963.     const useBorderBoxModelStylesheet                   = currentDocument.getElementById("webdeveloper-use-border-box-model");
  1964.     const viewStyleInformationStylesheet                = currentDocument.getElementById("webdeveloper-view-style-information");
  1965.  
  1966.     var checked = false;
  1967.     var element = null;
  1968.  
  1969.     checked = addUserStylesheet && !addUserStylesheet.disabled;
  1970.     element = document.getElementById("webdeveloper-add-user-style-sheet-menu");
  1971.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1972.  
  1973.     checked = disableDefaultStylesStylesheet && !disableDefaultStylesStylesheet.disabled;
  1974.     element = document.getElementById("webdeveloper-disable-default-styles-menu");
  1975.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1976.  
  1977.     checked = displayAccessKeysStylesheet && !displayAccessKeysStylesheet.disabled;
  1978.     element = document.getElementById("webdeveloper-display-access-keys-menu");
  1979.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1980.  
  1981.     checked = displayAnchorsStylesheet && !displayAnchorsStylesheet.disabled;
  1982.     element = document.getElementById("webdeveloper-display-anchors-menu");
  1983.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1984.  
  1985.     checked = displayBlockSizeStylesheet && !displayBlockSizeStylesheet.disabled;
  1986.     element = document.getElementById("webdeveloper-display-block-size-menu");
  1987.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1988.  
  1989.     checked = displayCurrentSizeTitleStylesheet && !displayCurrentSizeTitleStylesheet.disabled;
  1990.     element = document.getElementById("webdeveloper-display-current-size-title-menu");
  1991.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1992.  
  1993.     checked = displayFormDetailsStylesheet && !displayFormDetailsStylesheet.disabled;
  1994.     element = document.getElementById("webdeveloper-display-form-details-menu");
  1995.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1996.  
  1997.     checked = displayIDClassDetailsStylesheet && !displayIDClassDetailsStylesheet.disabled;
  1998.     element = document.getElementById("webdeveloper-display-id-class-details-menu");
  1999.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2000.  
  2001.     checked = displayImageDimensionsStylesheet && !displayImageDimensionsStylesheet.disabled;
  2002.     element = document.getElementById("webdeveloper-display-image-dimensions-menu");
  2003.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2004.  
  2005.     checked = displayImageFileSizesStylesheet && !displayImageFileSizesStylesheet.disabled;
  2006.     element = document.getElementById("webdeveloper-display-image-file-sizes-menu");
  2007.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2008.  
  2009.     checked = displayImagePathsStylesheet && !displayImagePathsStylesheet.disabled;
  2010.     element = document.getElementById("webdeveloper-display-image-paths-menu");
  2011.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2012.  
  2013.     checked = displayLinkPathsStylesheet && !displayLinkPathsStylesheet.disabled;
  2014.     element = document.getElementById("webdeveloper-display-link-paths-menu");
  2015.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2016.  
  2017.     checked = displayTabIndexStylesheet && !displayTabIndexStylesheet.disabled;
  2018.     element = document.getElementById("webdeveloper-display-tab-index-menu");
  2019.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2020.  
  2021.     checked = displayTopographicInformationStylesheet && !displayTopographicInformationStylesheet.disabled;
  2022.     element = document.getElementById("webdeveloper-display-topographic-information-menu");
  2023.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2024.  
  2025.     checked = hideBackgroundImagesStylesheet && !hideBackgroundImagesStylesheet.disabled;
  2026.     element = document.getElementById("webdeveloper-hide-background-images-menu");
  2027.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2028.  
  2029.     checked = hideImagesStylesheet && !hideImagesStylesheet.disabled;
  2030.     element = document.getElementById("webdeveloper-hide-images-menu");
  2031.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2032.  
  2033.     checked = linearizePageStylesheet && !linearizePageStylesheet.disabled;
  2034.     element = document.getElementById("webdeveloper-linearize-page-menu");
  2035.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2036.  
  2037.     checked = makeImagesInvisibleStylesheet && !makeImagesInvisibleStylesheet.disabled;
  2038.     element = document.getElementById("webdeveloper-make-images-invisible-menu");
  2039.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2040.  
  2041.     checked = outlineBlockLevelElementsStylesheet && !outlineBlockLevelElementsStylesheet.disabled;
  2042.     element = document.getElementById("webdeveloper-outline-block-level-elements-menu");
  2043.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2044.  
  2045.     checked = outlineCustomElementsStylesheet && !outlineCustomElementsStylesheet.disabled;
  2046.     element = document.getElementById("webdeveloper-outline-custom-elements-menu");
  2047.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2048.  
  2049.     checked = outlineDeprecatedElementsStylesheet && !outlineDeprecatedElementsStylesheet.disabled;
  2050.     element = document.getElementById("webdeveloper-outline-deprecated-elements-menu");
  2051.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2052.  
  2053.     checked = outlineFramesStylesheet && !outlineFramesStylesheet.disabled;
  2054.     element = document.getElementById("webdeveloper-outline-frames-menu");
  2055.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2056.  
  2057.     checked = outlineImagesWithAdjustedDimensionsStylesheet && !outlineImagesWithAdjustedDimensionsStylesheet.disabled;
  2058.     element = document.getElementById("webdeveloper-outline-images-with-adjusted-dimensions-menu");
  2059.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2060.  
  2061.     checked = outlineImagesWithEmptyAltAttributesStylesheet && !outlineImagesWithEmptyAltAttributesStylesheet.disabled;
  2062.     element = document.getElementById("webdeveloper-outline-images-with-empty-alt-attributes-menu");
  2063.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2064.  
  2065.     checked = outlineImagesWithoutAltAttributesStylesheet && !outlineImagesWithoutAltAttributesStylesheet.disabled;
  2066.     element = document.getElementById("webdeveloper-outline-images-without-alt-attributes-menu");
  2067.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2068.  
  2069.     checked = outlineImagesWithoutDimensionsStylesheet && !outlineImagesWithoutDimensionsStylesheet.disabled;
  2070.     element = document.getElementById("webdeveloper-outline-images-without-dimensions-menu");
  2071.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2072.  
  2073.     checked = outlineImagesWithoutTitleAttributesStylesheet && !outlineImagesWithoutTitleAttributesStylesheet.disabled;
  2074.     element = document.getElementById("webdeveloper-outline-images-without-title-attributes-menu");
  2075.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2076.  
  2077.     checked = outlineLinksWithoutTitleAttributesStylesheet && !outlineLinksWithoutTitleAttributesStylesheet.disabled;
  2078.     element = document.getElementById("webdeveloper-outline-links-without-title-attributes-menu");
  2079.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2080.  
  2081.     checked = outlineSelectedElementStylesheet && !outlineSelectedElementStylesheet.disabled;
  2082.     element = document.getElementById("webdeveloper-outline-selected-element-menu");
  2083.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2084.  
  2085.     checked = outlineTableCellsStylesheet && !outlineTableCellsStylesheet.disabled;
  2086.     element = document.getElementById("webdeveloper-outline-table-cells-menu");
  2087.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2088.  
  2089.     checked = outlineTablesStylesheet && !outlineTablesStylesheet.disabled;
  2090.     element = document.getElementById("webdeveloper-outline-tables-menu");
  2091.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2092.  
  2093.     checked = replaceImagesWithAltAttributesStylesheet && !replaceImagesWithAltAttributesStylesheet.disabled;
  2094.     element = document.getElementById("webdeveloper-replace-images-with-alt-attributes-menu");
  2095.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2096.  
  2097.     checked = showCommentsStylesheet && !showCommentsStylesheet.disabled;
  2098.     element = document.getElementById("webdeveloper-show-comments-menu");
  2099.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2100.  
  2101.     checked = useBorderBoxModelStylesheet && !useBorderBoxModelStylesheet.disabled;
  2102.     element = document.getElementById("webdeveloper-use-border-box-model-menu");
  2103.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2104.  
  2105.     checked = viewStyleInformationStylesheet && !viewStyleInformationStylesheet.disabled;
  2106.     element = document.getElementById("webdeveloper-view-style-information-menu");
  2107.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2108. }
  2109.  
  2110. // Updates the render mode status button
  2111. function webdeveloper_updateRenderMode(currentDocument)
  2112. {
  2113.     var element = document.getElementById("webdeveloper-render-mode-statusbar");
  2114.  
  2115.     // If the render mode button exists
  2116.     if(element)
  2117.     {
  2118.         const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  2119.         const renderMode         = currentDocument.compatMode;
  2120.         const stringBundle       = document.getElementById("webdeveloper-string-bundle");
  2121.  
  2122.         var textToolbar = false;
  2123.  
  2124.         // If the toolbar preference has a value and is set to text
  2125.         if(preferencesService.prefHasUserValue("webdeveloper.toolbar.icons") && preferencesService.getComplexValue("webdeveloper.toolbar.icons", Components.interfaces.nsISupportsString).data.trim() == "text")
  2126.         {
  2127.             textToolbar = true;
  2128.         }
  2129.  
  2130.         // If the render mode is quirks mode
  2131.         if(renderMode == "BackCompat")
  2132.         {
  2133.             element.setAttribute("class", "quirks webdeveloper-statusbar-button");
  2134.             element.setAttribute("tooltiptext", stringBundle.getString("webdeveloper_quirksModeTooltip"));
  2135.  
  2136.             // If the toolbar is in text mode
  2137.             if(textToolbar)
  2138.             {
  2139.                 element.setAttribute("label", stringBundle.getString("webdeveloper_quirksModeLabel"));
  2140.             }
  2141.         }
  2142.         else
  2143.         {
  2144.             element.setAttribute("class", "webdeveloper-statusbar-button");
  2145.             element.setAttribute("tooltiptext", stringBundle.getString("webdeveloper_standardsComplianceModeTooltip"));
  2146.  
  2147.             // If the toolbar is in text mode
  2148.             if(textToolbar)
  2149.             {
  2150.                 element.setAttribute("label", stringBundle.getString("webdeveloper_standardsComplianceModeLabel"));
  2151.             }
  2152.         }
  2153.     }
  2154. }
  2155.  
  2156. // View source
  2157. function webdeveloper_viewSource()
  2158. {
  2159.     const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  2160.  
  2161.     // If the view source in tab preference is set to true
  2162.     if(preferencesService.prefHasUserValue("webdeveloper.view.source.tab") && preferencesService.getBoolPref("webdeveloper.view.source.tab"))
  2163.     {
  2164.         const newTab = getBrowser().addTab("view-source:" + getBrowser().currentURI.spec);
  2165.  
  2166.         // If the open tabs in background preference is not set or is set to false
  2167.         if(!preferencesService.prefHasUserValue("webdeveloper.open.tabs.background") || !preferencesService.getBoolPref("webdeveloper.open.tabs.background"))
  2168.         {
  2169.             getBrowser().selectedTab = newTab;
  2170.         }
  2171.     }
  2172.     else
  2173.     {
  2174.         BrowserViewSourceOfDocument(getBrowser().contentDocument);
  2175.     }
  2176. }
  2177.  
  2178. // JavaScript console listener
  2179. const WebDeveloperJavaScriptConsoleListener =
  2180. {
  2181.     // Observes changes in the console
  2182.     observe: function(error)
  2183.     {
  2184.         // If the document, error and error message are set
  2185.         if(document && error && error.message)
  2186.         {
  2187.             const javaScriptButton = document.getElementById("webdeveloper-javascript-statusbar");
  2188.  
  2189.             // If the JavaScript button is set
  2190.             if(javaScriptButton)
  2191.             {
  2192.                 // Try to convert the error to a script error
  2193.                 try
  2194.                 {
  2195.                     const tempError = error.QueryInterface(Components.interfaces.nsIScriptError);
  2196.  
  2197.                     var errorCategory = error.category;
  2198.  
  2199.                     // If the error category is set
  2200.                     if(errorCategory)
  2201.                     {
  2202.                         // If the error category is content javascript or DOM:HTML
  2203.                         if(errorCategory == "content javascript" || errorCategory == "DOM:HTML")
  2204.                         {
  2205.                             const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  2206.                             const stringBundle       = document.getElementById("webdeveloper-string-bundle");
  2207.                             const warning            = error.flags & error.warningFlag != 0;
  2208.  
  2209.                             var textToolbar = false;
  2210.  
  2211.                             // If the toolbar preference has a value and is set to text
  2212.                             if(preferencesService.prefHasUserValue("webdeveloper.toolbar.icons") && preferencesService.getComplexValue("webdeveloper.toolbar.icons", Components.interfaces.nsISupportsString).data.trim() == "text")
  2213.                             {
  2214.                                 textToolbar = true;
  2215.                             }
  2216.  
  2217.                             // If this is a warning
  2218.                             if(warning)
  2219.                             {
  2220.                                 javaScriptButton.setAttribute("class", "warning webdeveloper-statusbar-button");
  2221.                                 javaScriptButton.setAttribute("tooltiptext", stringBundle.getFormattedString("webdeveloper_javaScriptWarningTooltip", [error.message]));
  2222.  
  2223.                                 // If the toolbar is in text mode
  2224.                                 if(textToolbar)
  2225.                                 {
  2226.                                     javaScriptButton.setAttribute("label", stringBundle.getString("webdeveloper_javascriptWarningLabel"));
  2227.                                 }
  2228.  
  2229.                                 // If the open JavaScript console warning preference is set
  2230.                                 if(preferencesService.prefHasUserValue("webdeveloper.open.javascript.console.warning") && preferencesService.getBoolPref("webdeveloper.open.javascript.console.warning"))
  2231.                                 {
  2232.                                     webdeveloper_openJavaScriptConsole();
  2233.                                 }
  2234.                             }
  2235.                             else
  2236.                             {
  2237.                                 javaScriptButton.setAttribute("class", "error webdeveloper-statusbar-button");
  2238.                                 javaScriptButton.setAttribute("tooltiptext", stringBundle.getFormattedString("webdeveloper_javaScriptErrorTooltip", [error.message]));
  2239.  
  2240.                                 // If the toolbar is in text mode
  2241.                                 if(textToolbar)
  2242.                                 {
  2243.                                     javaScriptButton.setAttribute("label", stringBundle.getString("webdeveloper_javascriptErrorLabel"));
  2244.                                 }
  2245.  
  2246.                                 // If the open JavaScript console error preference is set
  2247.                                 if(preferencesService.prefHasUserValue("webdeveloper.open.javascript.console.error") && preferencesService.getBoolPref("webdeveloper.open.javascript.console.error"))
  2248.                                 {
  2249.                                     webdeveloper_openJavaScriptConsole();
  2250.                                 }
  2251.                             }
  2252.                         }
  2253.                         else if(webdeveloper_debug && error.sourceName.indexOf("chrome://webdeveloper/") != -1)
  2254.                         {
  2255.                             toJavaScriptConsole();
  2256.                         }
  2257.                     }
  2258.                 }
  2259.                 catch(exception)
  2260.                 {
  2261.                     // Do nothing
  2262.                 }
  2263.             }
  2264.         }
  2265.  
  2266.         return false;
  2267.     }
  2268. }
  2269.